﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using AllInOne.Negocio;
using System.Timers;
using AllInOne.Dados;
using AllInOne.Util;
using System.Windows.Threading;

namespace AllInOne
{
    /// <summary>
    /// Interaction logic for TelaMateriaisPesquisar.xaml
    /// </summary>
    public partial class TelaMateriaisPesquisar : UserControl
    {
        #region Atributos

        private NegocioMaterial negocioMat;
        private Timer timer;
        private List<Material> materiais;

        #endregion;

        #region Inicialização

        public TelaMateriaisPesquisar()
        {
            InitializeComponent();
            Inicializar();
        }

        /// <summary>
        /// Inicialização da tela
        /// </summary>
        private void Inicializar()
        {
            this.negocioMat = new NegocioMaterial();
            this.materiais = new List<Material>();

            //Inicializa o timer de pesquisa
            this.timer = new Timer();
            this.timer.AutoReset = false;
            this.timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);

            //Recupera os itens do banco
            CarregarMateriais();
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Retorna a consulta com os itens do banco de dados
        /// </summary>
        private void CarregarMateriais()
        {
            this.materiais = negocioMat.pesquisar();
            dgMateriais.ItemsSource = this.materiais;
        }

        /// <summary>
        /// Chama tela de edição do item indicado
        /// </summary>
        /// <param name="atual"></param>
        private void EditarItem(Material atual)
        {
            DockPanel tempa = this.Parent as DockPanel;
            tempa.Children.Clear();

            TelaMateriaisAdicionar adicionar = new TelaMateriaisAdicionar(atual);
            tempa.Children.Add(adicionar);
        }

        /// <summary>
        /// Exclui o item indicado
        /// </summary>
        /// <param name="atual">Item para exclusão</param>
        private void ExcluirItem(Material atual)
        {
            bool resDelete = negocioMat.remover(atual);

            if (resDelete)
                CarregarMateriais();
        }

        #endregion

        #region Eventos dos botões e do 'timer' da tela

        private void grdEditar_Click(object sender, MouseButtonEventArgs e)
        {
            IEnumerable<Material> temp = ((System.Windows.Controls.Image)sender).BindingGroup.Items.Cast<Material>();
            Material atual = temp.FirstOrDefault<Material>();

            if (atual != null)
            {
                EditarItem(atual);
            }
        }

        private void grdExcluir_Click(object sender, MouseButtonEventArgs e)
        {
            Material atual = ((Image)sender).BindingGroup.Items[0] as Material;
            MessageBoxResult resultado = MensagemUtil.MostrarMensagemEConfirma("Deseja realmente excluir?", "Confirmação de exclusão");

            if (resultado == MessageBoxResult.Yes)
            {
                ExcluirItem(atual);
            }
        }

        private void txbLocalizar_KeyUp(object sender, KeyEventArgs e)
        {
            this.timer.Stop();
            this.timer.Interval = 200;
            this.timer.Start();
        }


        /// <summary>
        /// Término de uma contagem do timer. Realiza o filtro de acordo com texto digitado no box
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void timer_Elapsed(object sender, ElapsedEventArgs args)
        {
            this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
            {
                if (txbLocalizar.Text != "")
                {
                    //A 'lambda expression' está filtrando os itens que possuem o nome contendo o texto digitado
                    //Ou seja, o índice do texto digitado é maior do que zero na string do nome digitado
                    this.dgMateriais.ItemsSource = this.materiais.Where(material => (material.Nome.ToLower().IndexOf(txbLocalizar.Text.ToString().ToLower()) >= 0));
                }
                else
                {
                    this.dgMateriais.ItemsSource = this.materiais;
                }
            }));
        }

        #endregion;
    }
}
